from flask import Flask, jsonify, request
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
CORS(app)

# MySQL所在的主机名
HOSTNAME = "127.0.0.1"
# MySQL监听的端口号，默认是3306
PORT = 3306
# 连接MySQL的用户名，安装数据库时指定的
USERNAME = "root"
# 连接MySQL的密码，安装数据库时指定的
PASSWORD = "root"
# 要连接的数据库名称
DATABASE = "zhangsan"
# 组装连接参数，并配置在app.config中
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"

# 创建SQLAlchemy对象，传入app，主要是传入其中的连接参数
db = SQLAlchemy(app)


# 创建模型类
class Student(db.Model):
    __tablename__ = 'students'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50))
    age = db.Column(db.Integer)
    gender = db.Column(db.String(10))

    def to_dict(self):
        # 将对象转换为字典，以便可以序列化为JSON
        return {'id': self.id, 'name': self.name, 'age': self.age, 'gender': self.gender}

    @staticmethod
    def from_dict(data):
        # 静态方法，使用方式：类名.方法名()，创建学生对象，并从json中获取属性值设置对象属性
        student = Student()
        student.name = data.get('name')
        student.age = data.get('age')
        student.gender = data.get('gender')
        return student


# 获取所有学生
@app.route('/students', methods=['GET'])
def get_students():
    students = Student.query.all()
    return jsonify([student.to_dict() for student in students])


# 根据id获取学生
@app.route('/students/<int:id>', methods=['GET'])
def get_student(id):
    student = db.session.get(Student, id)
    return jsonify(student.to_dict())


# 添加学生
@app.route('/students', methods=['POST'])
def create_student():
    # 从请求参数中获取学生信息，构造学生对象，并添加到数据库中
    student = Student.from_dict(request.json)
    db.session.add(student)
    db.session.commit()
    return jsonify(student.to_dict()), 201


if __name__ == '__main__':
    app.run(debug=True)
